#ifndef __TASK_QUEUE_H
#define __TASK_QUEUE_H

#include <stdlib.h>
#include <ctype.h>

/**
 * @brief 任务结构体
 * 存储函数指针和参数指针
 */
typedef struct task_s
{
    void (*function)(void *); /**< 函数指针 */
    void *arg;                /**< 参数 */
    struct task_s *next;      /**< 指向下一个任务结构体 */
} Task_t;

/**
 * @brief 任务队列结构体
 * 存储队头、队尾及任务队列大小
 */
typedef struct task_queue_s
{
    Task_t *front; /**< 队头 */
    Task_t *rear;  /**< 队尾 */
    int size;      /**< 任务队列大小 */
} TaskQueue_t;

/**
 * @brief 创建任务队列结构体
 *
 * @return TaskQueue_t* 返回任务队列结构体指针
 */
TaskQueue_t *createTaskQueue();

/**
 * @brief 销毁任务队列结构体
 *
 * @param queue 任务队列结构体
 */
void destroyTaskQueue(TaskQueue_t *queue);

/**
 * @brief 任务队列入队
 * @todo 阻塞队列
 *
 * @param queue 任务队列结构体
 * @param task 任务结构体
 * @return int 返回是否入队成功
 *  @retval 0 成功
 *  @retval -1 失败
 */
int enqueue(TaskQueue_t *queue, Task_t *task);

/**
 * @brief 任务队列出队
 *
 * @param queue 任务队列结构体
 * @return task 任务结构体
 */
Task_t *dequeue(TaskQueue_t *queue);

#endif /* __TASK_QUEUE_H */
